import java.util.HashSet;

/*
 * @lc app=leetcode.cn id=345 lang=java
 *
 * [345] 反转字符串中的元音字母
 *
 * https://leetcode.cn/problems/reverse-vowels-of-a-string/description/
 *
 * algorithms
 * Easy (54.36%)
 * Likes:    268
 * Dislikes: 0
 * Total Accepted:    141.7K
 * Total Submissions: 260.6K
 * Testcase Example:  '"hello"'
 *
 * 给你一个字符串 s ，仅反转字符串中的所有元音字母，并返回结果字符串。
 * 
 * 元音字母包括 'a'、'e'、'i'、'o'、'u'，且可能以大小写两种形式出现。
 * 
 * 
 * 
 * 示例 1：
 * 
 * 
 * 输入：s = "hello"
 * 输出："holle"
 * 
 * 
 * 示例 2：
 * 
 * 
 * 输入：s = "leetcode"
 * 输出："leotcede"
 * 
 * 
 * 
 * 提示：
 * 
 * 
 * 1 <= s.length <= 3 * 10^5
 * s 由 可打印的 ASCII 字符组成
 * 
 * 
 */

// @lc code=start
class Solution {
    public String reverseVowels(String s) {
        char[] data=s.toCharArray();
        HashSet<Character> hashSet=new HashSet<>();
        hashSet.add('a');
        hashSet.add('A');
        hashSet.add('e');
        hashSet.add('E');
        hashSet.add('i');
        hashSet.add('I');
        hashSet.add('o');
        hashSet.add('O');
        hashSet.add('u');
        hashSet.add('U');
        int left=0,right=data.length-1;
        while (left<right) {
            while (!hashSet.contains(data[left])) {
                left++;
                if (left>right) {
                    break;
                }
            }
            while (!hashSet.contains(data[right])) {
                right--;
                if (left>right) {
                    break;
                }
            }
            if (left>right) {
                break;
            }
            char middle=data[left];
            data[left]=data[right];
            data[right]=middle;
            left++;
            right--;
        }
        StringBuilder StringBuilder=new StringBuilder();
        for (Character character : data) {
            StringBuilder.append(character);
        }
        return StringBuilder.toString();
    }
}
// @lc code=end

